package com.maikang.exammall.util;

import com.maikang.exammall.configuration.property.SendSmsProperty;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import lombok.extern.log4j.Log4j2;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 短信发送
 * 参考：https://cloud.tencent.com/document/product/382/43194#example
 * CAM 密钥查询：https://console.cloud.tencent.com/cam/capi
 * 短信控制台：https://console.cloud.tencent.com/smsv2
 */
@Log4j2
@Component
public class SmsUtil {

    private final SendSmsProperty smsProperty;
    private Credential cred;
    private SmsClient client;

    public SmsUtil(SendSmsProperty smsProperty) {
        this.smsProperty = smsProperty;
        cred = new Credential(smsProperty.getSecretId(), smsProperty.getSecretKey());
        client = new SmsClient(cred, "ap-guangzhou");
    }

    public void sendRegisterSMS(String smsCode, String... mobile) {
        sendSMS(smsProperty.getRegisterMessageTemplateId(), new String[] {smsCode, smsProperty.getMessageDuration()}, mobile);
    }

    @Async("threadPoolTaskExecutor")
    public void sendSMS(String templateId, String[] templateParamSet, String... mobile) {
        try {
            SendSmsRequest req = new SendSmsRequest();
            req.setSmsSdkAppId(smsProperty.getAppId());
            req.setSignName(smsProperty.getSmsSign());
            /* 国际/港澳台短信 SenderId: 国内短信填空，默认未开通，如需开通请联系 [sms helper] */
            String senderid = "";
            req.setSenderId(senderid);
            /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
            String sessionContext = "xxx";
            req.setSessionContext(sessionContext);
            /* 短信号码扩展号: 默认未开通，如需开通请联系 [sms helper] */
            String extendCode = "";
            req.setExtendCode(extendCode);
            /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
            req.setTemplateId(templateId);
            /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
             * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
//            String[] phoneNumberSet = {"+8621212313123", "+8612345678902", "+8612345678903"};
            req.setPhoneNumberSet(mobile);
            /* 模板参数: 若无模板参数，则设置为空 */
            req.setTemplateParamSet(templateParamSet);
            /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
             * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
            SendSmsResponse res = client.SendSms(req);
            // 输出json格式的字符串回包
            log.info("templateParamSet {} is sent to {}, resp is {}", Arrays.stream(templateParamSet).toArray(), Arrays.toString(mobile), SendSmsResponse.toJsonString(res));
        } catch (TencentCloudSDKException e) {
            log.error("failed to send msg {}, e: {}", Arrays.stream(templateParamSet).toArray(), e.getMessage());
        }
    }

    public void sendAppointmentOkSuccessSMS(String[] templateParamSet, String... mobile) {
        sendSMS(smsProperty.getAppointmentOkMessageTemplateId(), templateParamSet, mobile);
    }



}